【2023年7月版 】GitHub Actions 上で OIDC 連携 Assume Role してみる

【2023年7月版 】GitHub Actions 上で OIDC 連携 Assume Role してみる

Clock Icon2023.07.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、森田です。

本記事では、GitHub Actions で OIDC 連携で Assume Role する方法を紹介していきます

はじめに

直近で thumbprint が変更となっているため、以前と同じ値で設定するとエラーが生じるようです。

An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint

thumbprint 変更は、証明書変更となるタイミングで生じますので、手動更新または、自動更新の仕組みを導入する必要があります。

本記事では、2023年7月時点での以下の thumbprint を設定していきます。

1c58a3a8518e8759bf075b76b750d4f2df264fcd
f879abce0008e4eb126e0097e46620f5aaae26ad

ロールの作成

以下のコードを利用して CloudFormation でロールの作成を行います。

AWSTemplateFormatVersion: "2010-09-09"
Description: "IAM Role for OIDC GitHub"

Parameters:
  RepoName:
    Type: String

Resources:
  Role:
    Type: AWS::IAM::Role
    Properties:
      RoleName: OIDCGithubRole
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Action: sts:AssumeRoleWithWebIdentity
            Principal:
              Federated: !Ref GithubOidc
            Condition:
              StringLike:
                token.actions.githubusercontent.com:sub: !Sub repo:${RepoName}:*

  GithubOidc:
    Type: AWS::IAM::OIDCProvider
    Properties:
      Url: https://token.actions.githubusercontent.com
      ClientIdList: [sigstore]
      ThumbprintList: [1c58a3a8518e8759bf075b76b750d4f2df264fcd, f879abce0008e4eb126e0097e46620f5aaae26ad]

Outputs:
  Role:
    Value: !GetAtt Role.Arn

CloudFormation では、以下のようにリポジトリの入力が求められます。

CloudFormationスタック作成後は、出力に表示されているロールのARNをメモしておきます。

GitHub 側の設定

環境変数の設定

先ほど作成したロールのARNを環境変数に設定します。

ワークフローの作成

今回は、動作確認のため、以下のようなワークフローを作成します。

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      AWS_ROLE_ARN: ${{ secrets.AWS_ROLE_ARN }}
    permissions:
      id-token: write
      contents: read
    steps:
      - name: Checkout
        uses: actions/checkout@master  

      - name: Configure AWS
        run: |
          export AWS_ROLE_ARN=$AWS_ROLE_ARN
          export AWS_WEB_IDENTITY_TOKEN_FILE=/tmp/awscreds
          export AWS_DEFAULT_REGION=ap-northeast-1
          echo AWS_WEB_IDENTITY_TOKEN_FILE=$AWS_WEB_IDENTITY_TOKEN_FILE >> $GITHUB_ENV
          echo AWS_ROLE_ARN=$AWS_ROLE_ARN >> $GITHUB_ENV
          echo AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION >> $GITHUB_ENV
          curl -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" "$ACTIONS_ID_TOKEN_REQUEST_URL&audience=sigstore" | jq -r '.value' > $AWS_WEB_IDENTITY_TOKEN_FILE

      - run: aws sts get-caller-identity

上記のコードでは、GetCallerIdentityを実行して、アカウントIDなどを取得しています。

動作確認

作成したワークフローは、mainブランチへのpushをトリガーとしています。

実際にpushしてみると以下のようにログにて各種情報を取得できていれば、問題なく OIDC 連携で Assume Role ができています。

 

最後に

今回は、新しい thumbprint を用いて GitHub Actions 上で OIDC 連携 Assume Role をやってみましたがお手軽に実行できました。

手動で thumbprint を設定しましたが、自動で取得してくれるものあるので、そのようなものを導入するとより楽になりますね!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.